Colab Notebookでm2tsをCMカットエンコードする
若干邪悪な使い方のような気もしますが、別に規約で用途が機械学習に限定されているわけではないですし、スクレイピングよりはGPUインスタンスの活用ができるのでやっていきます
手元にmacしかなくてまともに動画エンコードできるPCがないのも後押し
まず、GPUを設定します
https://gyazo.com/60bdb207a3c6698bfad9fc197ea1b257
Colabで動画をエンコードしたいだけの場合は読み飛ばしてください
手元にDockerが動いて動画ファイルもあるのであれば手元で解析を行っても大丈夫です
うちはDockerが動く容量も有りませんし、動画ファイルを置いておける容量もありません(かつかつ過ぎる)
code:install.ipynb
!apt-get install -y autoconf automake libtool git build-essential libargtable2-dev libavutil-dev libavformat-dev libsdl1.2-dev libavcodec-dev
code:argtable.ipynb
%cd /content
!rm -rf argtable2-13.tar.gz argtable2-13
!tar xzf argtable2-13.tar.gz
%cd argtable2-13
!./configure
!make
!make install
%cd /content
code:comskip.ipynb
%cd /content
!git clone git://github.com/erikkaashoek/Comskip.git
%cd Comskip
%env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
!./autogen.sh
!./configure
!make
!make install
!comskip
%cd /content
code:conf.ipynb
問題なさそうな表示が出ていれば導入完了です
code:ok
Detection methods available:
1 - Black Frame
2 - Logo
4 - Scene Change
8 - Resolution Change
16 - Closed Captions
32 - Aspect Ratio
64 - Silence
128 - CutScenes
255 - USE ALL AVAILABLE
Errors:
ComSkip: missing option <file>
/content
注意点として、このブロックを導入すると上記のComskipのmakeが行えなくなります
code:cuda-ffmpeg.ipynb
!cp -r ./colab-ffmpeg-cuda/bin/. /usr/bin/
!ffmpeg -version
問題なさそうな表示が出ていれば導入完了です
code:ok
Cloning into 'colab-ffmpeg-cuda'...
remote: Enumerating objects: 59, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 59 (delta 15), reused 6 (delta 6), pack-reused 37
Unpacking objects: 100% (59/59), done.
Checking out files: 100% (32/32), done.
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libnpp --enable-cuda-llvm --pkgconfigdir=/content/workspace/lib/pkgconfig --prefix=/content/workspace --pkg-config-flags=--static --extra-cflags='-I/content/workspace/include -I/usr/local/cuda/include' --extra-ldflags='-L/content/workspace/lib -L/usr/local/cuda/lib64' --extra-libs='-lpthread -lm' --enable-static --disable-debug --disable-shared --disable-ffplay --disable-doc --enable-openssl --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libvpx --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libx265 --enable-runtime-cpudetect --enable-libfdk-aac --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libvidstab --enable-libaom --enable-libsrt
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
次に、動画ファイルをコピーしてきます
drivefs上の動画をカレントディレクトリ(/content)にコピーします
コピーしないまま-iにするとかかる時間が200倍ぐらいになります(2分が7時間とか)
扱いやすいasciiな名前でコピーすると良いです
Comskipにかけます
code:process_comskip.ipynb
!comskip -t --ini=comskip.ini target.m2ts
code:ok
Comskip 0.82.010, made using ffmpeg
Donator build
The commandline used was:
comskip -t --ini=comskip.ini target.m2ts
Setting ini file to comskip.ini as per commandline
Using comskip.ini for initiation values.
Auto selecting the PID.
88184 frames decoded in 277.98 seconds (317.23 fps)
Commercials were found.
target.vdrが生成されるので、これをもとにffmpegのパターンを生成します
良さそうなスクリプトが見つからなかったので自作です ちょっと考慮が甘かったりするかも
手元で実行するか、それこそColabで実行してください Total secondsの後に実行すべきコマンドが出てきます
code:ok
start_sec 2630.08
end_seconds 2892.29
Total seconds 2205.4799999999996
!ffmpeg -ss 0 -i target.m2ts -t 276.6 -c copy output_0.ts
!ffmpeg -ss 395.69 -i target.m2ts -t 634.8699999999999 -c copy output_1.ts
!ffmpeg -ss 1158.59 -i target.m2ts -t 578.02 -c copy output_2.ts
!ffmpeg -ss 1825.55 -i target.m2ts -t 381.03 -c copy output_3.ts
!ffmpeg -ss 2295.62 -i target.m2ts -t 334.96000000000004 -c copy output_4.ts
!ffmpeg -i "concat:output_0.ts|output_1.ts|output_2.ts|output_3.ts|output_4.ts" -c copy output.m2ts
最終行のconcatコマンドを除いて貼り付け、実行します
待ちます、長くなるとインタラクティブかどうか確認してくるのでチェック入れます
30分ぐらいのTSなら2分で終わります
エンコードパラメータを決めます
cudaを使うのは使うとして、でインタレースをする、ビットレートはどのぐらいなどを決めます
サンプル:映像を12mbpsで、音声をaac/192kbps/48000でデインターレースする
code:ipynb
!ffmpeg -loglevel warning -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i "concat:output_0.ts|output_1.ts|output_2.ts|output_3.ts|output_4.ts" -vf "yadif_cuda,hwdownload,format=nv12" -c:a aac -b:a 192k -ar 48000 -c:v h264_nvenc -b:v 12M output2.mp4
結果をダウンロードするか、driveに転送します
今日はdrivefsがおそすぎてダウンロードのほうが早く済みました 何が起こってるんだ
直接ダウンロードは日本リージョンかどうか関係してそう
code:region.ipynb